<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of ControladorCrawler
 *
 * @author Bruno
 */
include './Crawler.php';
class ControladorCrawler {
    /*
     * @ var $arr_obj_crawler : Todos os objetos do tipo crawler guardados
     * @ var $mat_resultados : Os resultados feito pelas crawlers
     * @ var $int_idDoCrawler : Os ID'S dados aos crawler criados
     * @ var $int_quantidadeCrawler : Quantidade de crawlers ativos no momento
     * @ var $boo_controladorAtivo : Se o controlador esta ligado/desligado
     * @ var $boo_pause : Estado se o controlador esta pausado
     * @ var $boo_existeAranhasPausadas : Se existe alguma aranha pausada no momento
     * @ var $boo_espacoBancoCrawler : Se existe espaço em banco que armazenara o conteudo 
     */

    private $int_idDoCrawler = 0;
    private $boo_controladorAtivo = true;
    private $boo_pause = false;
    private $boo_existeCrawlersPausados = false;
    private $boo_espacoBancoCrawler = false;
    private $arr_obj_crawler = array();
    private $arr_resultado;
    private $int_qtdCrawler;

    public function getInt_idDoCrawler() {
        return $this->int_idDoCrawler;
    }

    public function getBoo_controladorAtivo() {
        return $this->boo_controladorAtivo;
    }

    public function getBoo_pause() {
        return $this->boo_pause;
    }

    public function getBoo_existeCrawlersPausados() {
        return $this->boo_existeCrawlersPausados;
    }

    public function getBoo_espacoBancoCrawler() {
        return $this->boo_espacoBancoCrawler;
    }

    public function getArr_obj_crawler() {
        return $this->arr_obj_crawler;
    }
    public function addArr_obj_crawler($crawler) {
        return $this->arr_obj_crawler[] = ($crawler);
    }

    public function getArr_resultado() {
        return $this->arr_resultado;
    }

    public function getInt_qtdCrawler() {
        return $this->int_qtdCrawler;
    }

    public function setInt_idDoCrawler($int_idDoCrawler) {
        $this->int_idDoCrawler = $int_idDoCrawler;
    }

    public function setBoo_controladorAtivo($boo_controladorAtivo) {
        $this->boo_controladorAtivo = $boo_controladorAtivo;
    }

    public function setBoo_pause($boo_pause) {
        $this->boo_pause = $boo_pause;
    }

    public function setBoo_existeCrawlersPausados($boo_existeCrawlersPausados) {
        $this->boo_existeCrawlersPausados = $boo_existeCrawlersPausados;
    }

    public function setBoo_espacoBancoCrawler($boo_espacoBancoCrawler) {
        $this->boo_espacoBancoCrawler = $boo_espacoBancoCrawler;
    }

    public function setArr_obj_crawler($arr_obj_crawler) {
        $this->arr_obj_crawler = $arr_obj_crawler;
    }

    public function setArr_resultado($str_resultado) {
        $this->arr_resultado = $str_resultado;
    }

    public function setInt_qtdCrawler($int_qtdCrawler) {
        $this->int_qtdCrawler = $int_qtdCrawler;
    }

    public function delPosicaoArr_obj_crawler($par_int_IdCrawler) {
        //$this->arr_obj_crawler[] = $arr_obj_crawler;
        unset($this->arr_obj_crawler[$par_int_IdCrawler]);
    }

    public function OrganizarArr_obj_crawler() {
        //Reindexa todos os elementos do array
        $this->setArr_obj_crawler(array_values($this->getArr_obj_crawler()));
    }

    /*
     * Metodo principal do controlador de crawlers
     */

    function iniciarControladorCrawler() {
        while (true) {
            //Se estiver crawler ativos
            if ($this->getInt_quantidadeCrawler() > 0) {
               
               
                //Se o controlador estiver ativo
                
                if ($this->getBoo_controladorAtivo() == TRUE &&
                        $this->getBoo_pause() == TRUE &&
                        $this->getBoo_existeCrawlersPausados() == TRUE) {
                    //TTT
                    $this->InformativoCrawlersPausados();
                } else if ($this->getBoo_controladorAtivo() == TRUE &&
                        $this->getBoo_pause() == TRUE &&
                        $this->getBoo_existeCrawlersPausados() == FALSE) {
                    
                    //TTF
                    $this->pausarTodosCrawlers();
                } else if ($this->getBoo_controladorAtivo() == TRUE &&
                        $this->getBoo_pause() == FALSE &&
                        $this->getBoo_existeCrawlersPausados() == TRUE) {
                    
                    //TFT
                    $this->despausarTodosCrawlers();
                } else if ($this->getBoo_controladorAtivo() == TRUE &&
                        $this->getBoo_pause() == FALSE &&
                        $this->getBoo_existeCrawlersPausados() == FALSE) {
                    //Ciclo de rotina
                    //TFF
                    $this->manutencaoDosCrawlers();
                } else {
                    //Desativar todos crawlers
                    //F**
                    $this->desativasTodosCrawlers();
//                    
                }
            }
        }
    }

//Fim ligar controlador

    function InformativoCrawlersPausados() {
        //Exibe em tela ou algo do genero que esta nesse ponto
    }

    function pausarTodosCrawlers() {
        //While em todos crawlers
        //Existe crawlers pausados
        $this->setBoo_existeCrawlersPausados(TRUE);

        $int_qtdArray = count($this->getInt_quantidadeCrawler());
        for ($int_cont = 0; $int_cont < $int_qtdArray; $int_cont++) {
            $crawler = $this->getArr_obj_crawler()[$int_cont];
            $crawler->setBoo_pause(TRUE);
        }
    }

    function despausarTodosCrawlers() {
        //While em todos crawlers

        $int_qtdArray = count($this->getInt_quantidadeCrawler());
        for ($int_cont = 0; $int_cont < $int_qtdArray; $int_cont++) {
            $crawler = $this->getArr_obj_crawler()[$int_cont];
            $crawler->setBoo_pause(FALSE);
        }
        $this->setBoo_existeCrawlersPausados(FALSE);
    }

    function manutencaoDosCrawlers() {
        $int_qtdArray = $this->getInt_quantidadeCrawler();

        for ($int_cont = 0; $int_cont < $int_qtdArray; $int_cont++) {
            $crawler = $this->getArr_obj_crawler()[$int_cont];

            //Alimenta o crawler
            if ($crawler->getStr_site() == '' &&
                    $crawler->getBoo_conteudo() == FALSE) {
                //Alimentando aqui
                //coleta, limpa, alimenta, inicia()
            } else if ($crawler->getBoo_crawlerAtivo() &&
                    $crawler->getBoo_pause() &&
                    $crawler->getBoo_conteudo() &&
                    $crawler->getBoo_bloqueada() == FALSE) {


                $crawler->setBoo_bloqueada(TRUE);
                $this->setArr_resultado($crawler->getArr_serializado());

                //Limpando o crawler
                $crawler->setStr_charset('');
                $crawler->setStr_codigoFonte('');
                $crawler->setStr_site('');
                $crawler->setArr_tagsEPalavras(null);

                //Guardar o resutado no banco MONGO o resultado-----------------
                //METODO PARA O MONGO
                //Pega proximo link a trabalhar no banco MySQL------------------
                //METODO PARA O MYSQL
                //Trata a consulta e armazena em variaveis
                //$crawler->setStr_charset('CHARSET DO BANCO');
                //$crawler->setStr_site('SITE DO BANCO');
                //Inicia o crawler
                //$crawler->IniciarCrawler();
                
                
            } else if ($crawler->getBoo_crawlerAtivo() == FALSE &&
                    $crawler->getBoo_bloqueada() == FALSE &&
                    $crawler->getBoo_conteudo()
            ) {
                //Coleta, Limpa, quantidade -1, destroy
            } else {
                //Registra o log, crawler com seu estado e atributos
            }
        }
    }

    function desativarUmCrawler($int_idCrawler = null) {
        $int_qtdCrawlers = count($this->getInt_quantidadeCrawler());
        $crawler = null;

        if ($int_idCrawler != null) {
            //Desativa um crawlers
            for ($int_cont = 0; $int_cont < $int_qtdCrawlers; $int_cont++) {
                $crawler = $this->getArr_obj_crawler()[$int_cont];

                if ($crawler->getInt_idCrawler() == $int_idCrawler) {
                    //Bloqueia em tela o click nele
                    //Desativando
                    $crawler->setBoo_crawlerAtivo(FALSE);
                    //Sair do laço
                    break;
                }
            }
        } else {
            //Id == NULL
            //LOG de erro
        }
    }

    function pausarUmCrawler($int_idCrawler = null) {
        $int_qtdCrawlers = count($this->getInt_quantidadeCrawler());
        $crawler = null;

        if ($int_idCrawler != null) {
            //Desativa um crawlers
            for ($int_cont = 0; $int_cont < $int_qtdCrawlers; $int_cont++) {
                $crawler = $this->getArr_obj_crawler()[$int_cont];

                if ($crawler->getInt_idCrawler() == $int_idCrawler) {

                    //Desativando
                    $crawler->setBoo_pause(FALSE);
                    //Sair do laço
                    break;
                }
            }
        } else {
            //Id == NULL
            //LOG de erro
        }
    }

    function desativasTodosCrawlers() {
        //****Bloquer função criar novos crawler ou pausar até completar


        $int_qtdCrawlers = count($this->getInt_quantidadeCrawler());

        //Desativa todo crawlers
        for ($int_cont = 0; $int_cont < $int_qtdCrawlers; $int_cont++) {
            $crawler = $this->getArr_obj_crawler()[$int_cont];
            $crawler->setBoo_crawlerAtivo(FALSE);
        }

        //Enquanto existir crawler para trabalhar continue
        while (count($this->getInt_quantidadeCrawler()) > 0) {
            $int_qtdCrawlers = count($this->getInt_quantidadeCrawler());

//Recolhe os resultados
            for ($int_cont = 0; $int_cont < $int_qtdCrawlers; $int_cont++) {
                $crawler = $this->getArr_obj_crawler()[$int_cont];
                //Se o resultado do crawler estiver pronto
                if ($crawler->getBoo_conteudo()) {
                    //Pegando o resultado do crawler
                    $this->setArr_resultado($crawler->getArr_serializado());

                    //Guarda o resultado no banco
                    //MEtodo para guardar no banco
                    //Manutenção dos objetos e atributos
                    $this->delPosicaoArr_obj_crawler($int_cont);
                    $this->setInt_qtdCrawler(($this->getInt_qtdCrawler()) - 1);
                }
            }
        }
        //****Detravar funções de criar ou pausar crawlers
    }

    function criarCrawler() {
        //Instancia o objeto
        $c = new Crawler($this->getInt_idDoCrawler());

        //Codigo para teste
        $c->setStr_site('http://www.uol.com.br/');
        $c->IniciarCrawler();
        

        //Adiciona o crawler ao array 
        $this->addArr_obj_crawler($c);
        //Incrementa o contador de id dos crawlers
        $this->setInt_idDoCrawler(($this->getInt_idDoCrawler()) + 1);
        //Aumenta a quantidade de crawlers 
        $this->setInt_qtdCrawler(($this->getInt_qtdCrawler())+1);


        //Atualizar em tela o objeto criado
    }
    

    function deletarCrawler($par_int_idCrawler = null) {
        //Se o codigo não for nulo
        echo 'AAAA ID:' . $par_int_idCrawler;
        echo 'AAAA ID:' . $this->getInt_qtdCrawler();
        if ($par_int_idCrawler !== null) {
            $int_qtdArray = ($this->getInt_qtdCrawler());
            echo 'ZZZ.'.$int_qtdArray.'<br>';
            for ($int_cont = 0; $int_cont <= $int_qtdArray; $int_cont++) {
                echo 'Entro FOR<br>.';
                $crawler = $this->getArr_obj_crawler()[$int_cont];
                $int_IdCrawler = $crawler->getInt_idCrawler();
                echo 'ID do for:. ' . $int_IdCrawler;

                if ($par_int_idCrawler == $int_IdCrawler) {
                    $this->delPosicaoArr_obj_crawler($int_cont);
                    $this->OrganizarArr_obj_crawler();
                    echo 'Achou com o ID ' . $par_int_idCrawler.'<br>';
                    break;
                }
            }
        } else {
            //Mensagem de erro
        }
        echo 'XXXXXXXXXXXXXXXXXXXXX';
    }
    
    

}
$con = new ControladorCrawler();
$con->criarCrawler();
$con->deletarCrawler(0);